package DynamicProgramming;

import java.util.*;
/**
 *  首先输入一个n(1<=n<=100000) 代表西瓜的数量
 *  然后是n个西瓜的(weight,skipi) (1<=weight, skipi<=100000)
 *  输出能捡起西瓜的最大重量
 *
 *  输入：
 *  3
 *  2 2
 *  1 1
 *  1 1
 *  输出：
 *  2
 * */
public class 偷西瓜 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[][] water = new int[n][2];
        for (int i = 0; i < n; i++) {
            water[i][0] = scanner.nextInt();
            water[i][1] = scanner.nextInt();
        }

        //dp[i]表示当前能获得的最大价值,dp[i]取决于从开始到当前位置中前面偷了影响
        int[] dp = new int[n];
        //初始化
        dp[0] = water[0][0];

        for (int i = 1; i < n; i++) {
            int max = 0;
            for(int j = 0; j<i;j++){
                //当前位置的最大价值取决于当前位置之前的西瓜是否拿中的最大价值
                if(water[j][1] + j >= i){
                    //说明前面的西瓜拿了，并且需要跳过当前西瓜
                    max = Math.max(water[j][0],max);
                }else{
                    //说明前面的西瓜拿了，不影响当前的西瓜，可以拿当前的西瓜
                    max = Math.max(water[i][0]+water[j][0], max);
                }
            }
            dp[i] = max;
        }
        System.out.println(dp[n-1]);
    }
}
